在 DuckDB style SQL 中,吸收了很多這十年其他語言與資料函式庫的優點。
其中之一就是 Pandas。
Pandas 天生就支援 concat 把兩個 dataframe 水平 的黏起來
import pandas as pd
df1 = pd.DataFrame({'x': [1, 2, 3]})
df2 = pd.DataFrame({'s': ['a', 'b']})
result = pd.concat(
[df1, df2]
, axis=1
)
print(result)
x s
1 a
2 b
3 NaN
但是這件事情在 SQL 非常難辦到,這是一個在 Postgres 要辦到同樣的事情需要的 SQL
CREATE TABLE t1 AS SELECT * FROM (VALUES (1), (2), (3)) AS t(x);
CREATE TABLE t2 AS SELECT * FROM (VALUES ('a'), ('b')) AS t(s);
WITH
t1_numbered AS (
SELECT x, ROW_NUMBER() OVER () AS rn
FROM t1
),
t2_numbered AS (
SELECT s, ROW_NUMBER() OVER () AS rn
FROM t2
)
SELECT t1_numbered.x, t2_numbered.s
FROM t1_numbered
FULL OUTER JOIN t2_numbered ON t1_numbered.rn = t2_numbered.rn
ORDER BY t1_numbered.rn;
這是因為 SQL 是 set 的語意,並沒有天生的順序。
但是在讀檔案這個情境下,資料天生是有 row number 的,而且水平的黏起來兩個 table,非常自然。
DuckDB 支援 Position Join,可以想成就是 pd.concat。
CREATE TABLE t1 AS SELECT * FROM (VALUES (1), (2), (3)) AS t(x);
CREATE TABLE t2 AS SELECT * FROM (VALUES ('a'), ('b')) AS t(s);
SELECT *
FROM t1
POSITIONAL JOIN t2;
POSITIONAL JOIN 是一個 SQL 與 Dataframe 融合的好例子
趕快到 DuckDB WASM 或 Colab 試試看吧!